import {
    observe
} from './observer/index.js'

function proxy(vm, source, key) {
    Object.defineProperty(vm, key, {
        get() {
            return vm[source][key]
        },
        set(newValue) {
            vm[source][key] = newValue;
        }
    })
}
export function initState(vm) {
    const opts = vm.$options
    // vue 对opitions 处理顺序依次为 属性 方法 数据 计算属性 watch
    if (opts.data) {
        initData(vm)
    }
}

function initData(vm) {
    let data = vm.$options.data; // 用户传递的data
    data = vm._data = typeof data === 'function' ? data.call(vm) : data
    // 可以直接在vue 实例上使用data中的属性
    // 为了让用户更好的使用 我希望可以直接vm.xxx
    for (let key in data) {
        proxy(vm, '_data', key);
    }
    // 做对象的响应劫持，通过Object.defineProperty () 给属性增加get方法和set方法
    observe(data)
}